import 'package:enjoy_three/utils/http.dart';
import 'package:enjoy_three/utils/toast.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:permission_handler/permission_handler.dart';

class LocationList extends StatefulWidget {
  const LocationList({super.key});

  @override
  State<LocationList> createState() => _LocationListState();
}

class _LocationListState extends State<LocationList> {
  String apiKey = 'ec6f580a9ed57f6731978c15a3a50fb1';
  String baseUrl = 'https://restapi.amap.com/v3';

  List nearbyCommunities = [];
  String address = '';

  @override
  void initState() {
    super.initState();

    //  Latitude: 37.4219983, Longitude: -122.084
    // 40.065956, 116.350077
    // queryNearbyCommunities(40.065956, 116.350077);
    // reverseGeocoding(40.065956, 116.350077);
    // getCurrentLocation();
    requestLocationPermission();
  }

  Future<void> requestLocationPermission() async {
    PermissionStatus status = await Permission.location.request();
    if (status.isGranted) {
      // 权限未授予
      ToastUtil.showSuccess('位置权限授予');
      getCurrentLocation();
    } else {
      // 权限未授予
      ToastUtil.showError('位置权限未授予');
    }
  }

  Future<void> getCurrentLocation() async {
    late LocationSettings locationSettings;

    if (defaultTargetPlatform == TargetPlatform.android) {
      locationSettings = AndroidSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
        forceLocationManager: true,
        intervalDuration: const Duration(seconds: 10),
        foregroundNotificationConfig: const ForegroundNotificationConfig(
          notificationText:
              "Example app will continue to receive your location even when you aren't using it",
          notificationTitle: "Running in Background",
          enableWakeLock: true,
        ),
      );
    } else if (defaultTargetPlatform == TargetPlatform.iOS ||
        defaultTargetPlatform == TargetPlatform.macOS) {
      locationSettings = AppleSettings(
        accuracy: LocationAccuracy.high,
        activityType: ActivityType.fitness,
        distanceFilter: 100,
        pauseLocationUpdatesAutomatically: true,
        // Only set to true if our app will be started up in the background.
        showBackgroundLocationIndicator: false,
      );
    } else if (kIsWeb) {
      locationSettings = WebSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
        maximumAge: const Duration(minutes: 5),
      );
    } else {
      locationSettings = const LocationSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
      );
    }

    try {
      Position position = await Geolocator.getCurrentPosition(
        locationSettings: locationSettings,
      );
      ToastUtil.showSuccess('${position.latitude}, ${position.longitude}');
      print(position);
      queryNearbyCommunities(position.latitude, position.longitude);
      reverseGeocoding(position.latitude, position.longitude);
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> reverseGeocoding(double latitude, double longitude) async {
    String url =
        '$baseUrl/geocode/regeo?key=$apiKey&location=$longitude,$latitude';
    try {
      var response = await http.get(url);
      // print(response['regeocode']['formatted_address']);
      setState(() {
        address = response['regeocode']['formatted_address'];
      });
    } catch (e) {
      print('查询过程中出现错误: $e');
    }
  }

  Future<void> queryNearbyCommunities(double latitude, double longitude) async {
    String url =
        '$baseUrl/place/around?key=$apiKey&location=$longitude,$latitude&radius=500&types=住宅小区';
    try {
      var response = await http.get(url);
      for (var element in (response['pois'] as List)) {
        // print(element['name']);
        setState(() {
          nearbyCommunities.add(element);
        });
      }
    } catch (e) {
      print('查询过程中出现错误: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('选择社区')),
      body: ListView(
        padding: const EdgeInsets.all(10),
        children: [
          const Row(
            children: [Text('当前地址', style: TextStyle(color: Colors.grey))],
          ),
          const SizedBox(height: 10),
          Container(
            color: Colors.white,
            padding: const EdgeInsets.all(10),
            child: Row(
              children: [
                Expanded(child: Text(address)),
                const Row(
                  children: [
                    Icon(Icons.location_searching_outlined, color: Colors.blue),
                    SizedBox(width: 2),
                    Text('重新定位', style: TextStyle(color: Colors.blue)),
                  ],
                ),
              ],
            ),
          ),
          const SizedBox(height: 10),
          const Row(
            children: [Text('附近社区', style: TextStyle(color: Colors.grey))],
          ),
          const SizedBox(height: 10),
          ListView(
            shrinkWrap: true,
            physics: const NeverScrollableScrollPhysics(),
            children:
                nearbyCommunities
                    .map(
                      (item) => GestureDetector(
                        onTap: () {
                          Navigator.pushNamed(
                            context,
                            '/room_list',
                            arguments: {'point': item['name']},
                          );
                        },
                        child: Container(
                          color: Colors.white,
                          padding: const EdgeInsets.all(10),
                          child: Row(
                            children: [
                              Expanded(child: Text('${item['name']}')),
                              const Row(
                                children: [
                                  Icon(
                                    Icons.arrow_forward_ios,
                                    size: 16,
                                    color: Colors.black,
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                      ),
                    )
                    .toList(),
          ),
        ],
      ),
    );
  }
}
